//
// Created by songgf on 25-3-20.
//

#ifndef MAYO_BDF_TO_INP_CONVERTOR_H
#define MAYO_BDF_TO_INPCONVERTOR_H

#include <string>
#include <vector>
#include <map>

#include "convertor.h"

/**
 * @brief bdf转inp类
 */
class BdfToInpConvert : public Convertor
{
    struct Node
    {
        int id;
        double x, y, z;
    };

    struct Element
    {
        std::string type; //INP单元类型
        int id = 0; // 元素ID
        int pid = 0; //属性/截面ID
        std::vector<int> nodes; //结点号
    };

    struct RBE2
    {
        int id;           // RBE2 主节点
        int independentNode;  // GN主节点
        std::string dof;  //自由度字符串
        std::vector<int> dependentNodes;  //从节点列表
    };

    struct Material {
      int mid;
      double E = 0.0;
      double NU = 0.0;
      double RHO = 0.0;
    };

    std::map<int, Material>  midToMaterial;

    struct PShell {
    int pid;
    int mid1;
    double thickness = 0.0;
};

    std::map<int, PShell> pidToPshell;
    std::map<int, int> pidToIndex;
public:
    BdfToInpConvert();
    ~BdfToInpConvert();

    // 转换BDF为INP
    virtual int convert(const std::string &bdfPath, const std::string &inpPath) override;

private:
    // 解析BDF文件
    int parseBdfFile(const std::string& bdfPath);
    void parseNode(const std::string& line);
    void parseElement(const std::string& line);

    //BDF 单元类型映射到INP
    std::string mapBdfElementTypeToInp(const std::string& bdfType);

    //  生成INP文件
    int generateInpFile(const std::string& path);

    void parseRBE2(const std::string& fullLine);

    //  工具方法
    static void trim(std::string& s);
    static std::vector<std::string> split(const std::string& s, char delimiter);

    bool lineHasContinuation(const std::string& line);

    void parseRbe2Line(const std::string &line);

    void parseMat1(const std::string &line);

    void parsePshell(const std::string &line);

private:
    std::vector<Node> nodes;
    std::vector<Element> elements;
    std::vector<RBE2> rbe2Elements;
};

#endif // MAYO_BDFTOINPCONVERT_H
